package keter.framework.model.base;

import com.jfinal.plugin.activerecord.Model;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;


//@BindIgnore //忽略绑定
public  abstract class BaseModel<M extends BaseModel> extends Model<M> {
    /**
     * Logger for this class
     */
    private static final Logger logger = LoggerFactory.getLogger(BaseModel.class);
     
    
    /**
     * <p>Method ：getAttrs
     * <p>Description : 通过map读取属性字段(for jstl)
     * 
     * @see com.jfinal.plugin.activerecord.Model#getAttrs()
     * @author  gulixing@msn.com
     * @version 1.0.0
     */
    public Map<String, Object> getAttrs(){
        return super.getAttrs();
    }
   
    public void setID(){
    	this.set("id", UUID.randomUUID());
    }
    
	/**
	 * <p>Method ：getNum
	 * <p>Description : 返回主键
	 * @param attr
	 * @return 
	 * @author  gulixing@msn.com
	 * @version 1.0.0
	 */
	public Object getID() {
//		return getNum("id");
		return get("id");
	}
	
	public Object getID(String attr) {
//		return String.valueOf(getNum(attr));
		return get(attr);
	}
	
	public Integer getNum(String attr) {
	    if(super.getAttrs().get(attr) instanceof Integer){
	        return this.getInt(attr);
	    }
	    if(super.getAttrs().get(attr) instanceof Long){
	        return this.getLong(attr).intValue();
	    }
	    throw new NullPointerException("不支持的主键类型！");
	}
    
    /**
     * <p>Method ：wrap
     * <p>Description : 将入参包装成对象数组
     * @param objects
     * @return 
     * @author  gulixing@msn.com
     * @version 1.0.0
     */
    protected  Object[] wrap(Object... objects) {
    	List<Object> list = new ArrayList<Object>();
     	for (Object object : objects) {
			list.add(object);
		}
		return list.toArray();
	}
    
    /**
     * <p>Method ：validate
     * <p>Description : 后台校验(子类强制实现)
     *<br>对于前台已经添加了js校验的应用，通常后台数据校验失败并非普通请求而是源于非法攻击
     *<br>因此只需要简单记录，不需要感知和特别处理
     *<p>期望使用 ValidateUtil 进行校验，自动实现失败时只抛出运行时异常并简单记录错误信息
     * @see keter.framework.util.ValidateUtil
     * @return 
     * @author  顾力行-gulixing@msn.com
     */
    abstract protected void validate();
    
    /**
     * Model专属校验工具
     * @return 
     * @author  gulixing@msn.com
     * @date    2015年11月2日
     */
//    protected ValidateUtil validator(){
//        return new ValidateUtil(this);
//    }
   
    public boolean save(){
        validate();
        return super.save();
    }
    
    public boolean update(){
    	validate();
    	return super.update();
    }
    
//    public M fromJson(String json){
//        return this.put(json2Map(json));
//    }
      
//    private static Map<String, Object> json2Map(String json) {
//        try {
//            json = URLDecoder.decode(json, "utf-8");
//        } catch (UnsupportedEncodingException e) {
//            logger.error("json转换异常", e);
//        }
//        return (Map<String, Object>) JSON.parse(json);
//    }
 }